package com.scheduling.machine.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.scheduling.machine.entity.MachineTypeMaterialCompatibility;

import java.util.List;

/**
 * 机器类型原料兼容性服务接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
public interface IMachineTypeMaterialCompatibilityService extends IService<MachineTypeMaterialCompatibility> {

    /**
     * 创建兼容性配置
     *
     * @param compatibility 兼容性配置
     * @return 创建的兼容性配置
     */
    MachineTypeMaterialCompatibility createCompatibility(MachineTypeMaterialCompatibility compatibility);

    /**
     * 更新兼容性配置
     *
     * @param compatibility 兼容性配置
     * @return 更新后的兼容性配置
     */
    MachineTypeMaterialCompatibility updateCompatibility(MachineTypeMaterialCompatibility compatibility);

    /**
     * 删除兼容性配置
     *
     * @param compatibilityId 兼容性配置ID
     * @return 是否删除成功
     */
    boolean deleteCompatibility(String compatibilityId);

    /**
     * 根据ID查询兼容性配置详情
     *
     * @param compatibilityId 兼容性配置ID
     * @return 兼容性配置详情
     */
    MachineTypeMaterialCompatibility getCompatibilityDetail(String compatibilityId);

    /**
     * 分页查询兼容性配置
     *
     * @param current       当前页
     * @param size          页大小
     * @param machineTypeId 机器类型ID
     * @param materialId    原料ID
     * @param compatible    是否兼容
     * @return 分页结果
     */
    Page<MachineTypeMaterialCompatibility> getCompatibilityPage(long current, long size,
                                                                String machineTypeId, String materialId,
                                                                Boolean compatible);

    /**
     * 检查机器类型与单个原料的兼容性
     *
     * @param machineTypeId 机器类型ID
     * @param materialId    原料ID
     * @return 是否兼容
     */
    boolean isCompatible(String machineTypeId, String materialId);

    /**
     * 获取兼容性详细信息
     *
     * @param machineTypeId 机器类型ID
     * @param materialId    原料ID
     * @return 兼容性实体
     */
    MachineTypeMaterialCompatibility getCompatibilityDetail(String machineTypeId, String materialId);

    /**
     * 验证机器类型与原料列表的兼容性
     *
     * @param machineTypeId 机器类型ID
     * @param materialIds   原料ID列表
     * @throws RuntimeException 如果存在不兼容的原料
     */
    void validateMaterialsCompatibility(String machineTypeId, List<String> materialIds);

    /**
     * 获取机器类型的兼容原料列表
     *
     * @param machineTypeId 机器类型ID
     * @return 兼容的原料列表
     */
    List<MachineTypeMaterialCompatibility> getCompatibleMaterials(String machineTypeId);

    /**
     * 获取原料的兼容机器类型列表
     *
     * @param materialId 原料ID
     * @return 兼容的机器类型列表
     */
    List<MachineTypeMaterialCompatibility> getCompatibleMachineTypes(String materialId);

    /**
     * 获取机器类型的不兼容原料列表
     *
     * @param machineTypeId 机器类型ID
     * @return 不兼容的原料列表
     */
    List<MachineTypeMaterialCompatibility> getIncompatibleMaterials(String machineTypeId);

    /**
     * 批量检查原料兼容性
     *
     * @param machineTypeId 机器类型ID
     * @param materialIds   原料ID列表
     * @return 兼容性检查结果列表
     */
    List<MachineTypeMaterialCompatibility> checkBatchCompatibility(String machineTypeId, List<String> materialIds);

    /**
     * 设置机器类型与原料的兼容性
     *
     * @param machineTypeId 机器类型ID
     * @param materialId    原料ID
     * @param compatible    是否兼容
     * @param reason        不兼容原因
     */
    void setCompatibility(String machineTypeId, String materialId, Boolean compatible, String reason);

    /**
     * 批量创建兼容性配置
     *
     * @param compatibilities 兼容性配置列表
     * @return 创建的兼容性配置列表
     */
    List<MachineTypeMaterialCompatibility> batchCreateCompatibility(List<MachineTypeMaterialCompatibility> compatibilities);

    /**
     * 批量更新兼容性状态
     *
     * @param compatibilityIds 兼容性配置ID列表
     * @param compatible       新的兼容性状态
     * @param reason           不兼容原因
     * @return 更新的记录数
     */
    int batchUpdateCompatibility(List<String> compatibilityIds, Boolean compatible, String reason);
} 